﻿#ifndef _CMODULE_H_
#define _CMODULE_H_

#include "CQue.h"
#include "CSem.h"
#include "CThread.h"
#include "CMsg.h"
#include "CMap.h"

#ifdef __cplusplus
extern "C" {
#endif

#define USE_DEFAULT_MODULE_ENTRY	0
#define MODULE_NAME_MAX				31

typedef int(*MODULE_EXEMSG_FN)(struct _cmodule_*, CMsg* msg);
#define Virtual

#define AS_MODULE(var) ((CModule*)var)
#define ON_MODULE_MSG(module_class, msg_id) on_##module_class##_##msg_id(module_class* thes, CMsg* msg)
#define REG_MODULE_MSG_FUNC(module_class, module_ptr, msg_id) AS_MODULE(module_ptr)->msgid_func_map.insert(&AS_MODULE(module_ptr)->msgid_func_map, (void*)msg_id, (void*)on_##module_class##_##msg_id)


typedef struct _cmodule_ {
	//attribute
	CQue q;
	CSem sem;
	CThread th;
    CMap msgid_func_map;
	char module_name[MODULE_NAME_MAX + 1];

	//action
	int(*run)(struct _cmodule_*, void(*)(void *));
	int(*sendMsg)(struct _cmodule_*, CMsg*);
	Virtual MODULE_EXEMSG_FN exeMsg;
} CModule;

int construct_module(CModule* md, const char* module_name);

#ifdef __cplusplus
}
#endif
#endif
